import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'
import { getUserDetailById, getUserInfo, login } from '@/api/user'
// 状态
const state = {
  token: getToken(),
  userInfo: {}
  // 定义一个空的对象 不是null 因为后边我要开发userInfo的属性给别人用  userInfo.name
  // userInfo为什么我们不设置为null，而是设置为{}
  // 因为我们会在 getters 中引用 userinfo 的变量，如果设置为null，则会引起异常和报错
}
// 修改状态
const mutations = {
  // 设置token
  setToken(state, token) {
    state.token = token
    // 把token同步给缓存
    setToken(token)
  },
  // 删除缓存
  removeToken(state) {
    state.token = null
    // 先清除token，再传给缓存
    removeToken()
  },
  // 设置用户信息
  setUserInfo(state, result) {
    state.userInfo = result
  },
  // 删除用户信息
  removeUserInfo(state) {
    state.userInfo = {}
  }
}
// 执行异步
const actions = {
  // 定义login action  也需要参数 调用action时 传递过来的参数
  async login(context, data) {
    const result = await login(data) // 实际上就是一个promise  result就是执行的结果
    context.commit('setToken', result) // 已经在响应拦截器里处理过了
    // 登录时获取当前的时间戳
    setTimeStamp()
    // axios默认给数据加了一层data
    // if (result.data.success) {
    //   // 表示登录接口调用成功 也就是意味着你的用户名和密码是正确的
    //   // 现在有用户token
    //   // actions 修改state 必须通过mutations
    //   context.commit('setToken', result.data.data)
    // }
  },
  // 获取用户资料的action
  async getUserInfo(context) {
    const result = await getUserInfo() // 获取返回值
    const baseId = await getUserDetailById(result.userId) // 把id传过去
    const baseUserID = { ...result, ...baseId } // 合并
    context.commit('setUserInfo', baseUserID) // 将返回值设置到 mutation 中
    return result
  },
  logout(context) {
    context.commit('removeToken') // 删除token，已经处理过同步缓存了，所以不用再处理了
    context.commit('removeUserInfo') // 删除用户资料
  }
}
export default {
  namespaced: true,
  state,
  mutations,
  actions
}
